﻿#pragma once
#include "zyWindow.h"
#include "zyCtrol.h"
#include "zyMenu.h"
#include "zyAccelTable.h"

namespace DarkMoonUI {

	class zyForm : public  zyWindow
	{
	public:
		zyForm();
		~zyForm();
		//@参数 “窗口边框_”常量，返回“窗口边框_”开头常量
		int 边框(int Border);
		BOOL 托盘气泡提示(const std::wstring& 参数_气泡内容, const std::wstring& 参数_气泡标题, int 参数_气泡图标, int 参数_气泡显示时间);
		BOOL 托盘修改图标(zyIcon& 参数_图标);
		BOOL 托盘修改提示文本(const std::wstring& 参数_提示文本);
		BOOL 置托盘图标(zyIcon& 参数_图标, const std::wstring& 参数_提示文本);
		BOOL 置外形圆角(int 参数_圆角角度);
		int 背景图显示方式(int 参数_图片显示方式 = 0);
        int 背景图(const std::wstring& 参数_背景图路径);
		int 背景图(Gdiplus::Image* 参数_背景图路径);
		int 背景色(int 参数_背景色 = 0 /*RGB*/);
		//BOOL 置外形(GPRegion& 参数_区域);
		BOOL 托盘删除图标();
		BOOL 取控件(int 参数_控件ID, zyCtrol& 参数_控件);
		void 置等待鼠标();
		void 恢复鼠标();
		HWND 取控件句柄(int 参数_控件ID) const;
		int 置开始位置(int 参数_开始位置);
		zyIcon 取图标(BOOL 参数_是否大图标 = false);
		void 置图标(zyIcon& 参数_图标, BOOL 参数_是否大图标 = false);
		int 返回值(int 参数_返回值 = 0);
		BOOL 保持标题栏激活(BOOL 参数_保持标题栏激活);
		BOOL 保持标题栏激活();
		void 置快捷键(zyAccelTable& 参数_快捷键);
		BOOL 置菜单(zyMenu& 参数_菜单);
		zyMenu 取菜单();
		BOOL 重画菜单栏();
		int 位置(窗口位置 参数_窗口位置);
		BOOL Esc关闭(BOOL 参数_Esc关闭);
		BOOL Esc关闭();
		BOOL 随意移动(BOOL 参数_随意移动);
		//@事件回调类型 int OnClose(zyform* 来源对象){ return 0;}
		void 事件_可否被关闭(TRegEvent* 参数_事件指针);
		//@事件回调类型 int OnCreate(zyform* 来源对象){ return 0;}
		void 事件_创建完毕(TRegEvent* 参数_事件指针);
		//@事件回调类型 int OnMenuItemClick(zyform* 来源对象,int id){ return 0;}
		void 事件_菜单被单击(TRegEvent* 参数_事件指针);
		//@事件回调类型 int OnDestory(zyform* 来源对象){ return 0;}
		void 事件_将被销毁(TRegEvent* 参数_事件指针);
		//@事件回调类型 int OnMove(HWND hWnd,短整型 左边,短整型 顶边)
		void 事件_位置被改变(TRegEvent* 参数_事件指针);
		//@事件回调类型 int OnSize(HWND hWnd,短整型 客户区宽度,短整型 客户区高度)
		void 事件_尺寸被改变(TRegEvent* 参数_事件指针);
		//@事件回调类型 int OnActivate(HWND hWnd)
		void 事件_被激活(TRegEvent* 参数_事件指针);
		//@事件回调类型 int OnUnActivate(HWND hWnd)
		void 事件_被取消激活(TRegEvent* 参数_事件指针);
		//@事件回调类型 int OnFirstActivate(HWND hWnd)
		void 事件_首次激活(TRegEvent* 参数_事件指针);
		//@事件回调类型 int OnShow(HWND hWnd)
		void 事件_被显示(TRegEvent* 参数_事件指针);
		//@事件回调类型 int OnHide(HWND hWnd)
		void 事件_被隐藏(TRegEvent* 参数_事件指针);
		//@事件回调类型 int OnNotifIcon(HWND hWnd,整型 事件类型【“托盘_”开头常量】)
		void 事件_托盘事件(TRegEvent* 参数_事件指针);
		//@事件回调类型 int OnInitMenuPopup(HWND hWnd,HMENU 菜单句柄,整型 项目索引,逻辑型 是否系统菜单)
		void 事件_将弹出菜单(TRegEvent* 参数_事件指针);
		//@事件回调类型 int OnMenuSelect(HWND hWnd,HMENU 父菜单句柄,整型 菜单ID或索引【如果项目是弹出菜单，就是索引】,整型 菜单标志【菜单标志_ 开头常量】)
		void 事件_菜单项热点跟踪(TRegEvent* 参数_事件指针);
		//@事件回调类型 int 返回值：int【0表示可关闭，1表示不可关闭】OnUserClose(HWND hWnd) 当用户点击关闭按钮或系统菜单中的关闭菜单时触发
		void 事件_可否用户关闭(TRegEvent* 参数_事件指针);
		//@事件回调类型 int OnSysCommand(HWND hWnd,整型 ID,WORD 横坐标,WORD 纵坐标) 系统菜单等系统命令，触发此事件
		void 事件_系统命令(TRegEvent* 参数_事件指针);
	protected:
		virtual bool 被创建(zyForm*来源对象) { return 0; }
	private:
		
		void OnNCDestroy();
		BOOL zyForm_DefaulCommand(int id);
		void zyForm_OnClose(HWND hWnd);
		int zyForm_OnGetMinMaxInfo(HWND hWnd, MINMAXINFO *pInfo , BOOL* bHandled);
	protected:
		VOID _开始位置到坐标(HWND parent, int StartPosition, POINT size, POINT& pos, BOOL isDialog);
		static void  WINAPI zyForm_Destroy(zyObject* obj);
		static LRESULT  WINAPI zyForm_WndProc(zyObject* obj, HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL* bHandled);
	};

}

